﻿using System;
using System.Collections.Generic;
using System.Linq;

namespace CRM.Database.Model
{
    public class LegalEntitiesCollection : AbstractCollection
    {
        /// <summary>
        /// Стaтическая коллекция 
        /// </summary>
        protected static List<LegalEntities> _list;

        /// <summary>
        /// Коллекция юридических лиц
        /// </summary>
        public List<LegalEntities> LegalEntitiesList
        {
            get
            {
                return Entities.LegalEntities.ToList();

                if (_list == null)
                    _list = DB.Entities.LegalEntities.ToList();
                return _list;
            }
        }



        public bool Delete(LegalEntities le)
        {
            var addrCol = new AddressesCollection();

            foreach(var addr in le.Addresses)
            {
            if(!    addrCol.Delete(addr))
                return false;
            }

       return      base.Delete(le);
            
        }

        /// <summary>
        /// Обнуление статической коллекции
        /// </summary>
        protected override void SetStaticListToNULL()
        {
            _list = null;
        }

        /// <summary>
        /// Возвращает список Юр Лиц с заполненными контактами (ФИО, телефон и эл. почта)
        /// </summary>
        /// <param name="customerId"></param>
        /// <returns></returns>
        public List<LegalEntities> GetFullDefinedLegalEntitiesByCustomerId(int customerId)
        {
            var result = new List<LegalEntities>();
            var customersCol = new CustomersCollection();
            var customer = (Customers) customersCol.GetItemById(customerId);
            if (customer == null) return result;
            foreach (LegalEntities legalEntity in customer.LegalEntities)
            {
                if (legalEntity.Contacts.Count <= 0) continue;
                foreach (Contacts item in legalEntity.Contacts)
                {
                    if (!(string.IsNullOrEmpty(item.Name)) && !(string.IsNullOrEmpty(item.Phone)) &&
                        !(string.IsNullOrEmpty(item.Email)))
                    {
                        if (!result.Contains(legalEntity))
                            result.Add(legalEntity);
                    }
                }
            }
            return result;
        }


        /// <summary>
        /// Возвращает юр. лицо по номер у в САП
        /// </summary>
        /// <param name="numberInSap">Номер в САП</param>
        /// <returns>Юр. лицо</returns>
        public LegalEntities GetLegalEntityBySapNumber(int numberInSap)
        {
            return LegalEntitiesList.FirstOrDefault(c => c.NumberInSAP == numberInSap);
        }

        #region Overrides of AbstractCollection

        /// <summary>
        /// Обновление элемента в коллекции
        /// </summary>
        /// <param name="item">Новый элемент</param>
        /// <param name="userLogin">Логин пользователя, который делает изменения</param>
        /// <returns>Результат операции</returns>
        public bool Update(object item, string userLogin)
        {
            var newObject = (LegalEntities) item;
            if (newObject == null)
                return false;


            var object4Update = GetItemByIdFromDatabase(newObject.GetKeyValue()) as LegalEntities;
            if (object4Update == null)
                return false;

            if (newObject.IdOwnershipPattern != null)
                if (newObject.IdOwnershipPattern > 0)
                    object4Update.IdOwnershipPattern = newObject.IdOwnershipPattern;

            if (newObject.IsForContract != null)
                object4Update.IsForContract = newObject.IsForContract;

            object4Update.IdCustomer = newObject.IdCustomer;

            if (!string.IsNullOrEmpty(newObject.Name))
                object4Update.Name = newObject.Name;

            if (newObject.NumberInSAP != null)
                object4Update.NumberInSAP = newObject.NumberInSAP;


            object4Update.IsActive = newObject.IsActive;


            return base.Update(object4Update, userLogin);
        }


        /// <summary>
        /// Получение списка элементов
        /// </summary>
        /// <returns>Список элементов</returns>
        public override List<object> GetList()
        {
            return new List<object>(LegalEntitiesList);
        }

        /// <summary>
        /// Получение типа текущего элемента
        /// </summary>
        /// <returns></returns>
        protected override Type GetItemType()
        {
            return typeof (LegalEntities);
        }

        /// <summary>
        /// Получение статического списка для хранения объектов
        /// </summary>
        /// <returns></returns>
        public override object GetStaticCollection()
        {
            return _list;
        }

        /// <summary>
        /// Получение элемента из коллекции по идентификатору
        /// </summary>
        /// <param name="itemId">Идентификатор</param>
        /// <returns>Элемент</returns>
        public override object GetItemById(int itemId)
        {
            return Entities.LegalEntities.Find(itemId);
        }

        #endregion
    }
}